package org.whh.automatic.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.whh.automatic.model.AutoTask;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 自动任务服务类
 * <p>
 * 该服务负责自动化任务的持久化管理，主要功能包括：
 * 1. 保存任务配置到文件系统
 * 2. 从文件系统加载任务配置
 * 3. 获取所有已保存的任务列表
 * 4. 删除指定的任务配置
 * <p>
 * 任务配置以序列化对象的形式存储在文件系统中，
 * 文件名格式为：任务名称.task
 */
@Service
public class AutoTaskService {

    /**
     * 日志记录器
     */
    private static final Logger logger = LoggerFactory.getLogger(AutoTaskService.class);

    /**
     * 任务保存目录
     * 从配置文件中注入，用于指定任务配置文件的存储位置
     */
    @Value("${automatic.task.save-path}")
    private String taskDir;

    /**
     * 保存自动任务
     * <p>
     * 将任务对象序列化并保存到文件系统中。
     * 如果目标目录不存在，会自动创建。
     * 文件名格式为：任务名称.task
     *
     * @param task 要保存的任务对象
     * @return 保存成功返回true，失败返回false
     */
    public boolean saveTask(AutoTask task) {
        // 确保目录存在
        File dir = new File(taskDir);
        if (!dir.exists()) {
            dir.mkdirs();
        }

        File taskFile = new File(taskDir + File.separator + task.getName() + ".task");

        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(taskFile))) {
            oos.writeObject(task);
            logger.info("保存任务成功: {}", task.getName());
            return true;
        } catch (IOException e) {
            logger.error("保存任务失败: " + task.getName(), e);
            return false;
        }
    }

    /**
     * 加载指定任务
     * <p>
     * 从文件系统中读取并反序列化指定名称的任务配置。
     * 如果任务文件不存在或加载过程出错，返回null。
     *
     * @param taskName 要加载的任务名称
     * @return 加载成功返回任务对象，失败返回null
     */
    public AutoTask loadTask(String taskName) {
        File taskFile = new File(taskDir + File.separator + taskName + ".task");

        if (!taskFile.exists()) {
            logger.warn("任务文件不存在: {}", taskName);
            return null;
        }

        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(taskFile))) {
            AutoTask task = (AutoTask) ois.readObject();
            logger.info("加载任务成功: {}", taskName);
            return task;
        } catch (IOException | ClassNotFoundException e) {
            logger.error("加载任务失败: " + taskName, e);
            return null;
        }
    }

    /**
     * 获取所有任务列表
     * <p>
     * 扫描任务保存目录，返回所有.task文件对应的任务名称列表。
     * 任务名称不包含.task后缀。
     * 如果目录不存在或为空，返回空列表。
     *
     * @return 包含所有任务名称的列表
     */
    public List<String> getAllTaskNames() {
        List<String> taskNames = new ArrayList<>();

        File dir = new File(taskDir);
        if (!dir.exists()) {
            return taskNames;
        }

        File[] files = dir.listFiles((d, name) -> name.endsWith(".task"));
        if (files != null) {
            for (File file : files) {
                String fileName = file.getName();
                taskNames.add(fileName.substring(0, fileName.length() - 5));
            }
        }

        return taskNames;
    }

    /**
     * 删除任务
     * <p>
     * 从文件系统中删除指定名称的任务配置文件。
     * 如果文件不存在，返回false。
     *
     * @param taskName 要删除的任务名称
     * @return 删除成功返回true，失败返回false
     */
    public boolean deleteTask(String taskName) {
        File taskFile = new File(taskDir + File.separator + taskName + ".task");

        if (!taskFile.exists()) {
            logger.warn("任务文件不存在: {}", taskName);
            return false;
        }

        boolean result = taskFile.delete();
        if (result) {
            logger.info("删除任务成功: {}", taskName);
        } else {
            logger.error("删除任务失败: {}", taskName);
        }

        return result;
    }
}
